package com.adams.dcxt.core;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.criterion.Criterion;


/**
 * 
 * @param <T>
 * @param <ID>
 * File Name    : GenericDAO.java
 * @Description 	: 基类 DAO 接口
 * @author 903819
 */
public interface GenericDao <T, PK extends Serializable>{
	
	/**
	 * 
	 * Description 	: 保存 实体对象
	 *
	 * @param entity
	 *
	 */
	public void save(final T entity);
	
	/**
	 * 
	 * Description 	: 删除 实体对象
	 *
	 * @param entity
	 *
	 */
	public void delete(final T entity);
	
	/**
	 * 
	 * Description 	: 获取 实体对象
	 *
	 * @param id
	 * @return
	 *
	 */
	public T get(final PK id);
	
	/**
	 * 
	 * Description 	: 更新 实体对象
	 *
	 * @param entity
	 *
	 */
	public void update(final T entity);
	
	/**
	 * 
	 * Description 	: 保存或更新 实体对象
	 *
	 * @param entity
	 *
	 */
	public void saveOrUpdate(final T entity);
	
	/**
	 * 
	 * Description 	: 	初始化对象.
	 * 					使用load()方法得到的仅是对象Proxy, 在传到View层前需要进行初始化.
	 * 					只初始化entity的直接属性,但不会初始化延迟加载的关联集合和属性.
	 * 					如需初始化关联属性,可实现新的函数,执行:
	 * 					Hibernate.initialize(user.getRoles())，初始化User的直接属性和关联集合.
	 * 					Hibernate.initialize(user.getDescription())，初始化User的直接属性和延迟加载的Description属性.
	 *
	 *
	 * @param entity
	 *
	 */
	public void initEntity(T entity);
	
	/**
	 * 
	 * Description 	: 初始化对象
	 *
	 * @param entityList
	 *
	 */
	public void initEntity(List<T> entityList);
	
	/**
	 * 
	 * Description 	: 按HQL查询对象列表 
	 *
	 * @param <X>
	 * @param hql
	 * @param values
	 * @return
	 *
	 */
	public <X> List<X> query(final String hql, final Object... values);
	
	/**
	 * 
	 * Description 	: 按HQL查询对象列表
	 *
	 * @param <X>
	 * @param hql
	 * @param values
	 * @return
	 *
	 */
	public <X> List<X> query(final String hql, final Map<String, Object> values);
	
	/**
	 * 
	 * Description 	: 按HQL查询唯一对象
	 *
	 * @param <X>
	 * @param hql
	 * @param values
	 * @return
	 *
	 */
	public <X> X findUnique(final String hql, final Object... values);
	
	/**
	 * 
	 * Description 	: 按HQL查询唯一对象
	 *
	 * @param <X>
	 * @param hql
	 * @param values
	 * @return
	 *
	 */
	public <X> X findUnique(final String hql, final Map<String, Object> values);
	
	/**
	 * 
	 * Description 	: 按Criteria查询唯一对象
	 *
	 * @param criterions
	 * @return
	 *
	 */
	public T findUnique(final Criterion... criterions);
	
	/**
	 * 
	 * Description 	: 根据查询HQL与参数列表创建Query对象
	 *
	 * @param queryString
	 * @param values
	 * @return
	 *
	 */
	public Query createQuery(final String queryString, final Object... values);
	
	/**
	 * 
	 * Description 	: 根据查询HQL与参数列表创建Query对象
	 *
	 * @param queryString
	 * @param values
	 * @return
	 *
	 */
	public Query createQuery(final String queryString, final Map<String, Object> values);
	
	/**
	 * 
	 * Description 	: 根据查询HQL与参数列表 执行
	 *
	 * @param queryString
	 * @param values
	 * @return
	 *
	 */
	public int executeUpdate(final String queryString, final Object... values);
	
	/**
	 * 
	 * Description 	: 根据查询HQL与参数列表 执行
	 *
	 * @param queryString
	 * @param values
	 * @return
	 *
	 */
	public int executeUpdate(final String queryString, final Map<String, Object> values);
	public List<Object[]> exeSql(String sql) ;
	public void executeSql(String sql);
}
